#ifndef RING_SCALING_H
#define RING_SCALING_H
#include <vector>
#include <gmpxx.h>
#include "ring.h"
#include "ring_basis_extension.h"
#include "modular_reduction.h"
#include "utils.h"
/* *
 * @class RNSScaler
 * @brief 表示基于模数缩放（RNS）操作的类。
 *
 * `RNSScaler` 类用于在加密算法中进行基于环的缩放操作，特别是与同态加密中的模数缩放相关的操作。
 */
class RNSScaler {
public:
    Ring *ringQ;
    Ring *ringT;
    Poly *polypoolQ;
    Poly *polypoolT;
    mpz_class qHalf;    // (q-1)/2
    uint64_t qHalfModT; // (q-1)/2 mod t
    uint64_t qInv;      // (q mod t)^-1 mod t
    FastBasisExtender *baseconverterQ1Q2;
    // 构造函数
    RNSScaler(Ring *ringQ, Ring *ringT);
    // 拷贝构造函数
    RNSScaler(const RNSScaler &other) = default;
    RNSScaler &operator = (const RNSScaler &other) = default;
    // 移动构造函数
    RNSScaler(RNSScaler &&other) = delete;
    RNSScaler &operator = (RNSScaler &&other) = delete;


    void DivByQOverTRounded(Poly *p1Q, Poly *p2T);
};

#endif // RING_SCALING_H